package org.jeecg.modules.fund.service.impl;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.fund.entity.FundLibrary;
import org.jeecg.modules.fund.entity.FundOptional;
import org.jeecg.modules.fund.entity.FundValue;
import org.jeecg.modules.fund.mapper.FundOptionalMapper;
import org.jeecg.modules.fund.service.IFundLibraryService;
import org.jeecg.modules.fund.service.IFundOptionalService;
import org.jeecg.modules.fund.service.IFundValueService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class FundOptionalServiceImpl extends ServiceImpl<FundOptionalMapper, FundOptional> implements IFundOptionalService {
    @Autowired
    private IFundLibraryService fundLibraryService;
    @Autowired
    private IFundValueService fundValueService;

    @Override
    public Result<FundOptional> add(FundOptional optional) {
        // 查询一下基金库中是否存在数据
        FundLibrary fundLibrary = fundLibraryService.getById(optional.getFundId());
        if(fundLibrary == null) {
            return Result.error("数据不存在");
        }
        // 查询一下是否重复自选
        FundOptional entity = this.getOne(new LambdaQueryWrapper<FundOptional>()
                        .eq(FundOptional::getFundId,optional.getFundId())
                        .eq(FundOptional::getUserId,optional.getUserId()));
        if(entity != null) {
            return Result.error("重复自选");
        }
        // 设置自选日期
        optional.setCreateDate(new Date());
        // 设置添加时间
        optional.setCreateTime(new Date());
        // 设置更新时间
        optional.setUpdateTime(new Date());
        // 设置默认倍率
        optional.setDefaultSafeVal(fundLibrary.getDefaultSafeVal());
        optional.setDefaultAddVal(fundLibrary.getDefaultAddVal());
        optional.setDefaultReduceVal(fundLibrary.getDefaultReduceVal());
        optional.setDefaultDangerVal(fundLibrary.getDefaultDangerVal());
        // 设置净值
        optional.setCreateVal(fundLibrary.getNowVal());

        // 保存
        this.save(optional);
        return Result.ok(optional);
    }

    @Override
    public Result<String> delete(String id) {
        Result<String> result = new Result<>();
        // 通过ID删除
        this.removeById(id);
        return result.success("删除成功");
    }

    @Override
    public Result<List<Dict>> queryWave(String fundId) {
        // 表名
        String tableName = fundValueService.tableName(fundId);
        // 获取列表数据
        List<FundValue> mapList = baseMapper.queryWave(tableName,fundId);
        // 加仓起始时间
        boolean addStartTime = false;
        // 加仓值
        List<BigDecimal> addList = new ArrayList<>();
        // 减仓起始时间
        boolean jcStartTime = false;
        // 减仓值
        List<BigDecimal> jcList = new ArrayList<>();
        // 空数据
        Dict param = new Dict();
        // 结果集
        List<Dict> result = new ArrayList<>();
        // 遍历处理
        for (FundValue data : mapList) {
            String date = DateUtil.format(data.getValDate(),"yyyy-MM-dd");
            // 加仓处理
            if ("加仓区".equals(data.getTip())) {
                // 新的波段开始
                if (jcStartTime) {
                    // 此时需要重新刷新数据
                    jcStartTime = false;
                    addStartTime = false;
                    // 设置加仓数组
                    param.set("addList", addList);
                    // 更新加仓结束时间
                    param.set("addEndTime", param.getStr("addTime"));
                    param.set("jcList", jcList);
                    param.set("jcEndTime",param.getStr("jcTime"));
                    result.add(param);
                    param = new Dict();
                    addList = new ArrayList<>();
                    jcList = new ArrayList<>();
                }

                // 设置加仓起始时间
                if (!addStartTime) {
                    param.set("addStartTime", date);
                    addStartTime = true;
                }
                // 每次都更新记录加仓时间
                param.set("addTime", date);
                // 每次都更新记录加仓值
                param.set("addVal", date);
                // 加仓数组
                addList.add(data.getNowVal());
            }

            // 减仓处理
            if (("减仓区".equals(data.getTip())) && addStartTime) {
                // 设置减仓起始时间
                if (!jcStartTime) {
                    // 设置减仓起始时间
                    param.set("jcStartTime", date);
                    // 设置减仓起始时间标志
                    jcStartTime = true;
                }
                // 每次都更新记录减仓时间
                param.set("jcTime", date);
                // 每次都更新记录减仓值
                param.set("jcVal", data.getNowVal());
                // 减仓数组
                jcList.add(data.getNowVal());
            }
        }

        if (jcStartTime) {
            // 此时需要重新刷新数据
            // 设置加仓数组
            param.set("addList", addList);
            // 更新加仓结束时间
            param.set("addEndTime", param.getStr("addTime"));
            param.set("jcList", jcList);
            param.set("jcEndTime",param.getStr("jcTime"));
            result.add(param);
        }
        return Result.OK(result);
    }
}
